﻿/*********************************************************************
 * Nombre: ConfigurarCharset.cs
 * Descripción: Clase encargada del manejo de la configuración de 
 * caracteres.
 * Autor: DRD
 * Modificaciones:
 * ******************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace BXPI
{
    public partial class ConfigurarCharset : Form
    {

        int indice=-1;
        private string[] files;
        private string charset;
        private Boolean configurado = false;
        private Parser Parser;

        public struct configCharset {
            public string charset;
            public Boolean aprenderPalabras;
            public Boolean reducirCharset;
        }
        public configCharset charsetCfg;
        
        /// <summary>
        /// Fija el objeto del Parser
        /// </summary>
        /// <param name="Parser"></param>
        public ConfigurarCharset(Parser Parser)
        {
            this.Parser = Parser;
            InitializeComponent();
        }

        /// <summary>
        /// Obtiene automáticamente los charsets de la carpeta ./Charsets
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ConfigurarCharset_Load(object sender, EventArgs e)
        {
            if (!configurado)
            {
                try
                {
                    files = System.IO.Directory.GetFiles("./Charsets", "*.htm");
                }
                catch {
                    System.IO.Directory.CreateDirectory("./Charsets");
                    files = System.IO.Directory.GetFiles("./Charsets", "*.htm");
                }
                if (txtChars.Text == "")
                {
                    txtChars.Text = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
                    comboCharsets.Text = "ISO/IEC 8859-1:1998 Latin Alphabet No. 1";
                }

                rellenarCombo();
                configurado = true;
            }
        }

        /// <summary>
        /// Rellena el combo de charsets
        /// </summary>
        private void rellenarCombo() {

            string sLine = "";
            string titulo = "";

            for (int i = 0; i < files.Length; i++)
            {
                StreamReader objReader = new StreamReader(files[i]); ;

                while (sLine != null)
                {
                    sLine = objReader.ReadLine();
                    if (sLine != null)
                        if (sLine.IndexOf("<h1>") != -1)
                        {
                            titulo = sLine;
                            titulo = titulo.Replace("<h1><font face=\"Arial\">", "");
                            titulo = titulo.Replace("    ", "");
                            titulo = titulo.Replace("</font></h1>", "");
                            break;

                        }

                }
                comboCharsets.Items.Add(titulo);
                objReader.Close();
            }
            
        }

        /// <summary>
        /// Muestra el charset seleccionado en el combo, en el cuadro de texto
        /// </summary>
        private void MostrarCharset()
        {

            string sLine = "";
            string caracter = "";

                StreamReader objReader = new StreamReader(files[indice]); ;

                while (sLine != null)
                {
                    sLine = objReader.ReadLine();
                    if (sLine != null)
                        if (sLine.IndexOf("      <td align=\"center\">") != -1)
                        {
                            for (int i = 0; i < 2; i++)
                            {
                                sLine = objReader.ReadLine();
                            }
                            caracter = sLine;
                            caracter = caracter.Replace("      <td align=\"center\">", "");
                            caracter = caracter.Replace("</td>", "");
                            charset = charset + caracter;

                        }

                }
                
                objReader.Close();
                int num;
                if (charset==null){
                    sLine = "";
                    objReader = new StreamReader(files[indice]); ;
                    while (sLine != null)
                    {
                        sLine = objReader.ReadLine();
                        if (sLine != null)
                            if (sLine.IndexOf("<tr><td>") != -1)
                            {
                                caracter = sLine;
                                num = caracter.IndexOf("</td><td>",32);
                                caracter = caracter.Substring(num-1,1);
                                
                                charset = charset + caracter;
                                sLine = objReader.ReadLine();

                            }

                    }
                    
                    objReader.Close();

                }

                txtChars.Clear();
                txtChars.Text = charset;
                charset = null;

        }

        /// <summary>
        /// Llama al método que muestra el charset seleccionado cuando cambia el combo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboCharsets_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtChars.Clear();
            
            indice = comboCharsets.SelectedIndex;
            MostrarCharset();
        }

        /// <summary>
        /// Comprueba que el charset no está vacío y si lo está fija los valores por defecto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ConfigurarCharset_FormClosing(object sender, FormClosingEventArgs e)
        {
            charsetCfg.charset = txtChars.Text;
            charsetCfg.aprenderPalabras = chbPalabras.Checked;
            charsetCfg.reducirCharset = chbReduccion.Checked;
            if (charsetCfg.charset == "")
            {
                charsetCfg.charset = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
                MessageBox.Show("Se utilizará el charset por defecto.", "No ha introducido caracteres", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            Parser.setConfigCharset(charsetCfg.charset, charsetCfg.aprenderPalabras = chbPalabras.Checked, charsetCfg.reducirCharset = chbReduccion.Checked); 

            //e.Cancel = true;
            //this.Hide();
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Cambia el mensaje del combo cuando se edita el cuadro de texto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtChars_TextChanged(object sender, EventArgs e)
        {
            comboCharsets.Text = "Configuración manual";
        }


    }
}
